#ifndef ECHOSERVER_H_
#define ECHOSERVER_H_

#include "07_TcpServer.hpp"
#include "08_Threadpool.hpp"

namespace xy
{

// 声明一个外部变量来访问服务器实例
// 不过在封装Echo_Server以后，看样子就不用单独定义一个全局变量啦
// extern xy::TcpServer* g_server;

class MessageHandler;
//class DefaultMessageHandler;

class Echo_Server{
public:
    Echo_Server(unsigned short, const std::string&, int, int);
    
    // 生命周期管理
    void start();
    void stop();

    // 状态查询接口
    bool get_is_running(){ return _is_running; }

    // 时间回调函数 - 处理连接、消息和关闭事件
    static void signal_handler(int signum);                                                 // 处理ctrl + c信号，优雅退出
    void on_connection(const TCPconnection::TCPconnectionPtr& conn);                        // 新连接建立回调
    void on_message(const TCPconnection::TCPconnectionPtr& conn, const std::string &msg);   // 消息接受回调
    void on_close(const TCPconnection::TCPconnectionPtr& conn);                             // 连接关闭回调

    // 业务逻辑处理方法 - 调用对应的消息处理器处理消息
    std::string handle_message1(const std::string& msg);
    std::string handle_message2(const std::string& msg);

    // 设置消息处理器(默认default)
    void set_message_handler(std::shared_ptr<MessageHandler> handler)
    {
        _default_handler = handler;
    }
    //void set_message_handler2(std::shared_ptr<MessageHandler> handler)
    //{
    //    _message_handler2 = handler;
    //}

private:
    // 核心组件
    TcpServer           _tcpserver;
    ThreadPool          _thread_pool;
    
    // signal_handler信号处理所需的静态函数指针
    static Echo_Server* _instance;  // 信号处理函数通常需要全局函数或者静态成员函数
    
    // 消息处理器 - 使用策略模式实现不同的消息处理逻辑
    // 基类都是MessageHandler，所以不需要两个相同的指针
    //std::shared_ptr<MessageHandler> _message_handler;  // 默认消息处理器
    //std::shared_ptr<MessageHandler> _message_handler2;  // 备用消息处理器
    std::shared_ptr<MessageHandler> _default_handler;
    std::shared_ptr<MessageHandler> _mytask_handler;


    // 连接映射 - 维护连接与消息处理器的对应关系
    // - 将连接的文件描述符(int类型)映射到对应的消息处理器(MessageHandler 基类指针)，通过这个映射，我们可以
    // -- 为每个客户端连接分配不同的消息处理器
    // -- 利用多态特性，通过基类指针调用派生类的handle方法
    // -- 消息处理器封装了所有必要的数据和方法来处理特定类型的消息
    std::map<int, std::shared_ptr<MessageHandler>> _conn_to_handler; // 添加连接到处理器的映射
    
    // 服务器状态
    bool                _is_running;
};
}

#endif
